/*-------------------------------------------------------------------------
 *
 * partprune.h
 *	  partprune.c 的原型
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/partitioning/partprune.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef PARTPRUNE_H
#define PARTPRUNE_H

#include "nodes/execnodes.h"
#include "partitioning/partdefs.h"

struct PlannerInfo;				/* 避免在此处包含 pathnodes.h */
struct RelOptInfo;


/*
 * PartitionPruneContext
 *		存储在运行时进行与单个分区表相关的修剪计算所需的信息。
 *
 * strategy			分区策略，例如LIST、RANGE、HASH。
 * partnatts		分区键中的列数。
 * nparts			此分区表中的分区数量。
 * boundinfo		分区表的分区边界信息。
 * partcollation		存储分区键列的排序规则的partnatts元素数组。
 * partsupfunc		与分区键（partnatts元素）相关的比较或哈希函数的FmgrInfos数组。
 *					（通常指向partrel的分区键。）
 * stepcmpfuncs		用于每个修剪步骤和分区键的比较或哈希函数的FmgrInfos数组。
 * ppccontext		保存此PartitionPruneContext的附属数据的内存上下文，例如FmgrInfos。
 * planstate		在执行过程中调用时指向父计划节点的PlanState；从计划器调用时为NULL。
 * exprcontext		在评估修剪表达式时使用的ExprContext。
 * exprstates		ExprStates数组，根据PruneCxtStateIdx索引；每个修剪步骤中每个分区键一个。
 *					如果planstate非NULL则分配，否则为NULL。
 */
typedef struct PartitionPruneContext
{
	char		strategy;
	int			partnatts;
	int			nparts;
	PartitionBoundInfo boundinfo;
	Oid		   *partcollation;
	FmgrInfo   *partsupfunc;
	FmgrInfo   *stepcmpfuncs;
	MemoryContext ppccontext;
	PlanState  *planstate;
	ExprContext *exprcontext;
	ExprState **exprstates;
} PartitionPruneContext;

/*
 * PruneCxtStateIdx()计算step_id和分区键列keyno的stepcmpfuncs[]
 * 和exprstates[]数组的正确索引。
 *（注意：有代码假设给定步骤的条目是连续的，因此这不是随意选择的。）
 */
#define PruneCxtStateIdx(partnatts, step_id, keyno) \
	((partnatts) * (step_id) + (keyno))

extern PartitionPruneInfo *make_partition_pruneinfo(struct PlannerInfo *root,
													struct RelOptInfo *parentrel,
													List *subpaths,
													List *prunequal);
extern Bitmapset *prune_append_rel_partitions(struct RelOptInfo *rel);
extern Bitmapset *get_matching_partitions(PartitionPruneContext *context,
										  List *pruning_steps);

#endif							/* PARTPRUNE_H */
